# coding=utf-8
import json

from django_redis import get_redis_connection

from erp_system.models import PermissionsModel


def redis_storage_permissions(user):
    '''
        把当前用户的权限信息，缓存到Redis数据库中
        Redis 中存放用户权限的结构为：user_用户ID --> 字典{key:path,value[列表] }（JSON字符串）
    '''

    # 得到权限的ID
    permission_ids = user.roles.values_list('permissions', flat=True).distinct()

    # 根据权限ID，获取权限的所有值，一级菜单的权限除外
    # 就只拿一级菜单除外的菜单，values返回的是字典（字段名作为键），后面的是指定返回的字段
    # 这里返回的是列表，列表里面包含着字典
    permissions = PermissionsModel.objects.filter(is_menu=False, id__in=permission_ids).values('id', 'path', 'method',
                                                                                               'name')

    # 保护性代码
    # 没有查到权限
    if not permissions.exists():  # permissions里面是一个列表，列表里面没有元素
        return

    permissions_dict = {}  # 存放当前用户的权限,path为key
    for permission in permissions:
        # 因为数据需要转化成JSON格式的字符串，所以要排除那些特殊符号
        # replace将不可见字符（'\u200b'）转化为（''）空字符
        # 不可见字符（有特殊含义，但看不到）：回车换行符，制表符
        method = str(permission.get('method')).replace('\u200b', '')
        path = str(permission.get('path')).replace('\u200b', '')
        # 加下划线的意义就是区分一些临时变量，区分字段名字
        _name = str(permission.get('name')).replace('\u200b', '')
        _id = permission.get('id')  # ID不可能有字符串了，因为他是自增的

        if path in permissions_dict:
            permissions_dict[path].append({
                'method': method,
                'sign': _name,
                'id': _id
            })
        else:
            permissions_dict[path] = [{
                'method': method,
                'sign': _name,
                'id': _id
            }]
    for key in permissions_dict:
        permissions_dict[key] = json.dumps(permissions_dict[key])

    # 存放到redis中
    # 配好了redis的连接和安装django_redis
    redis_conn = get_redis_connection('default') # 获取redis数据库的连接
    redis_conn.hmset(f'user_{user.id}',permissions_dict) # 插入到redis数据库中




